package com.leetcode.蓝桥杯.十二届国赛;

import java.util.Arrays;
import java.util.Scanner;

public class 编程题7 {	
	static long INF = 200000L * 200000L + 1;//区间的最大值
	static final int N = 200000 + 1;//数组的个数
	static int[] num = new int[N];//原数组
	static long[] sum = new long[N];//前缀和数组，sum[i]表示索引1到i的和，定义为long
	static int[] vec = new int[N];//记录的是 大于1 的数字 的下标（注意：存的是下标）
	static int[] suf = new int[N];//记录num[i]后面有多少个连续的1
	
	/**
	 * 计算区间和
	 * @param l
	 * @param r
	 * @return
	 */
	static long get(int l, int r) {
        return sum[r] - sum[l - 1];
    }
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int tot = 0;//大于1的数字的个数
		//输入
		for(int i = 1;i <= n;i++) {
			num[i] = input.nextInt();
			if(num[i] > 1) {
				vec[tot++] = i;//记录的是下标
			}
			sum[i] = sum[i - 1] + num[i];//前缀和
		}
		//计算suf
		int cnt = 0;
		for(int i = n;i > 0;i--) {
			if(num[i] > 1) {
				suf[i] = cnt;
				cnt = 0;
			}else {
				cnt++;
			}
		}
		int res = 0;//最终的结果
		//遍历左端点，确定一个左端点有哪些是满足条件的右端点
		for(int i = 1;i <= n;i++) {
			res++;//长度为1的区间，也满足题意
			long now = num[i];//now表示当前区间的乘积
			//遍历右端点
			int pos = 0;//右端点的起始位置
			for(int j = 0;j < tot;j++) {
				if(vec[j] <= i) continue;//右端点必须大于左端点
				pos = j;
				break;
			}
			for(int j = pos;j < tot;j++) {
				now *= num[vec[j]];
				if(now > INF) break;//乘积超出最大值，以i为左端点的区间，后边就都不用再继续判断了
				/**
				 * 如果get(i,vec[j]) <= now，就保持当前区间的乘积不变，判断后面有没有连续的1可以来补充'区间和',看看够不够
				 */
				if(get(i,vec[j]) <= now && now <= get(i,vec[j]) + suf[vec[j]]) {
					res++;//
				}
			}
		}
		System.out.println(res);
		input.close();
	}

}
